/**
 * @ Author: enmoion
 * @ Create Time: 2023-11-4 10:12:05
 * @ Modified by: enmotion
 * @ Modified time: 2023-09-25 17:07:20
 * @ Description:
 * vue3-spa入口文件
 */

import '@src/assets/index.css';
import 'element-plus/dist/index.css';
import 'element-plus/theme-chalk/dark/css-vars.css';
// import 'vant/lib/index.css';
// import '@src/assets/theme.css';
import Bowser from "bowser"; // 引入浏览器侦测模块
import PGS from "./pages";
import { createApp, type App } from 'vue';
import { createPinia } from 'pinia'; // 引入 pinia 管理器;
import { useGlobalComponents } from "@src/comps"; // 导入全局懒加载组件
import router from './router'; // vue-router 路由实例
import { setProxyRouter } from './router/use.lib'; // 代理路由创建实例方法;
import { useRouterStateStore } from './router/state';
import publicStroes from "@src/stores";
import microApp from "@micro-zoe/micro-app";
import AppVue from './App.vue'; //
import { useConfirmPlugin, useMessagePlugin } from "@src/use.lib/publicPlugins";
import { userMenuSampleData } from "@src/pages/login-pg/config/dynamic-router-list";
import { eventBusOnMessageHandler } from './use.lib/microAppEventBusCenter';

let app:App<Element>|null = null;
const isMicroAppRunTime:boolean = window['__MICRO_APP_ENVIRONMENT__']||false; // 判断当前应用是否运行在 micro-app 框架下

const str = "Hello, World!";
const binaryData = btoa(str);
console.log(binaryData,str);

window.mount = async ()=>{
  // 初始化APP
  app = createApp(AppVue).use(createPinia());
  const appStore = publicStroes.useAppStateStore();
  appStore.setMicroAppEnvironment(isMicroAppRunTime); // 判断应用是否在 MicroApp 嵌套环境模式，并将该状态传递给全局状态管理器
  appStore.setDevice( Bowser.getParser(window.navigator.userAgent).parse()); //提交设备硬件系统环境数据至全局缓存
  appStore.setScreen({ breakPoint:800, h: document.body.clientHeight, w: document.body.clientWidth, }); // 设置当前屏幕信息
  window.addEventListener('resize',function(){ appStore.setScreen({ h: document.body.clientHeight, w: document.body.clientWidth }) }); // 添加屏幕侦听

  useGlobalComponents(app); // 全局引入公共组件并装配到根目录下

  // 创建动态路由管理器
  // const router = initRouter({
  //   multipleCatch:import.meta.env.VITE_APP_DYNAMIC_ROUTE_MUTIPLE, // 是否为多路由缓存机制，开启该机制后，路由将支持所有访问过的路由表与初次加载的路由表，全面支持浏览器标签地址黏贴访问形式，前提是缓存共享；
  //   mode:import.meta.env.VITE_APP_ROUTE_HISTORY_MODE, // 路由模式 history | hash
  //   baseRoute:import.meta.env.VITE_APP_SITE_BASE_ROUTER // 基础路由地址 baseRoute
  // }); // 创建路由，配置路由缓存模式为多项还是单项
  
  const proxyRouter = setProxyRouter(router,{ catchStore:useRouterStateStore(), pageTemplates:PGS, mutipleCatch:true }); // 初始化代理路由实例;
  await proxyRouter.reloadRoutes(); // 当用户刷新应用时，需要重新装填全部的缓存路由表中的路由；
  
  console.warn('router loaded after refresh');
  useMessagePlugin(app); // 全局 $message 方法绑定
  useConfirmPlugin(app); // 全局 $confirm
  // 微应用的免密登录操纵
  if(isMicroAppRunTime){
    const data = window.microApp?.getData() // 返回主应用下发的data数据
    publicStroes.useUserBaseStateStore().setToken(data?.token||{});
    publicStroes.useUserBaseStateStore().setInfo(data?.info||{});
    window.microApp.addDataListener(eventBusOnMessageHandler,true)// 引用之间的通讯，全部通过消息中心处理器收集处理
    // 后台管控路由的情况下，需要启用获取用户菜单行为
    if(import.meta.env.VITE_APP_ROUTE_BACKEND_RULE){ 
      console.log('后台路由获取...');
      // router.generateRousteByTreeData(...res ); // 获取后，添加到路由表
    }else{
      proxyRouter.generateRousteByTreeData(userMenuSampleData); // 用前端菜单装配路由表
    }
    // microApp.start({tagName:`micro-app-${import.meta.env.VITE_APP_NAME}`}); // 当出现嵌套子应用情况，需要考虑添加标签尾缀，未测试；
    // router.generateRousteByTreeData() //如果存在后端管控路由的情况，在此处装填路由表；
  };
  app.use(router); // 一定要记得，app.use(router) 必须在 proxyRouter.reloadRoutes 与 proxyRouter.generateRousteByTreeData 之后调用，不然可能会出现路由表未能正确装填的情况;
  console.log('app mount');
  app.mount('#app'); // 构建
};

// 作为子应用时，暴露给主应用的销毁hook
window.unmount =()=>{
  console.log('app unmount');
  app?.unmount();
  window.microApp.removeDataListener(eventBusOnMessageHandler); // 作为子应用时，销毁时，移除消息侦听;
};

if(!isMicroAppRunTime){
  console.log('microApp host:');
  microApp?.start(); // 只有在主应用情况下，才能执行 microApp.start() 嵌套情况则更加复杂; 见 micro-app 文档
  window.mount();
  // microApp?.addDataListener(eventBusOnMessageHandler,true); // 作为主应用时，开启全局侦听 待测试此消息中心的能力
};
